package com.powernode.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.BeanProperty;
import com.powernode.constant.BusinessEnum;
import com.powernode.domain.Member;
import com.powernode.domain.ProdComm;
import com.powernode.ex.handler.BusinessException;
import com.powernode.feign.ProdMemberFeign;
import com.powernode.mapper.ProdCommMapper;
import com.powernode.model.Result;
import com.powernode.service.ProdCommService;
import com.powernode.vo.ProdCommData;
import org.apache.commons.collections4.BagUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ProdCommServiceImpl extends ServiceImpl<ProdCommMapper, ProdComm> implements ProdCommService {

    @Autowired
    ProdCommMapper prodCommMapper;

    /**
     * 回复和审核商品评论
     *
     * @param prodComm 商品评论对象
     * @return 更新成功返回true，否则返回false
     */
    @Override
    public Boolean replyAndExamineProdComm(ProdComm prodComm) {
        // 获取回复内容
        String replyContent = prodComm.getReplyContent();
        // 如果回复内容非空
        if (StringUtils.hasText(replyContent)) {
            // 设置回复时间
            prodComm.setReplyTime(new Date());
            // 设置回复状态为已回复
            prodComm.setReplySts(1);
        }
        // 调用mapper的更新方法，并判断更新是否成功
        return prodCommMapper.updateById(prodComm) > 0;
    }

    /**
     * 根据商品ID查询微信商品评论数据
     *
     * @param prodId 商品ID
     * @return 包含所有评论数量、好评数量、中评数量、差评数量、带图评论数量、好评率的ProdCommData对象
     */
    @Override
// 定义一个方法，用于根据产品ID查询微信产品评论数据
    public ProdCommData queryWxProdCommDataByProdId(Long prodId) {
        // 查询状态为1（假设1代表有效评论）的产品评论总数
        Long allCount = prodCommMapper.selectCount(new LambdaQueryWrapper<ProdComm>().eq(ProdComm::getProdId, prodId) // 等于指定的产品ID
                .eq(ProdComm::getStatus, 1)); // 并且状态为1

        // 查询状态为1且评价为0（假设0代表好评）的评论数量
        Long goodCount = prodCommMapper.selectCount(new LambdaQueryWrapper<ProdComm>().eq(ProdComm::getProdId, prodId).eq(ProdComm::getStatus, 1).eq(ProdComm::getEvaluate, 0));

        // 查询状态为1且评价为1（假设1代表中评）的评论数量
        Long secondCount = prodCommMapper.selectCount(new LambdaQueryWrapper<ProdComm>().eq(ProdComm::getProdId, prodId).eq(ProdComm::getStatus, 1).eq(ProdComm::getEvaluate, 1));

        // 查询状态为1且评价为2（假设2代表差评）的评论数量
        Long badCount = prodCommMapper.selectCount(new LambdaQueryWrapper<ProdComm>().eq(ProdComm::getProdId, prodId).eq(ProdComm::getStatus, 1).eq(ProdComm::getEvaluate, 2));

        // 查询状态为1且有图片的评论数量
        Long picCount = prodCommMapper.selectCount(new LambdaQueryWrapper<ProdComm>().eq(ProdComm::getProdId, prodId).eq(ProdComm::getStatus, 1).isNotNull(ProdComm::getPics));

        // 初始化好评率为0
        BigDecimal goodLv = BigDecimal.ZERO;

        // 计算好评率，这里有一个逻辑错误，goodLv始终为0，所以这一段代码实际上不会执行任何操作
        // 应该是判断allCount是否为0，避免除以0的情况
        if (0 != allCount) {
            // 计算好评率并设置到goodLv变量中
            goodLv = new BigDecimal(goodCount).divide(new BigDecimal(allCount), 3, RoundingMode.HALF_DOWN) // 除以总评论数，保留三位小数，四舍五入
                    .multiply(new BigDecimal(100)); // 乘以100转换为百分比
        }

        // 使用构建器模式创建ProdCommData对象，并设置相应的属性值
        return ProdCommData.builder().allCount(allCount).goodCount(goodCount).secondCount(secondCount).picCount(picCount).goodLv(goodLv).badCount(badCount).build();
    }

    @Autowired
    ProdMemberFeign prodMemberFeign;

    /**
     * 查询微信商品评论分页列表
     *
     * @param current  当前页码
     * @param size     每页数量
     * @param prodId   商品ID
     * @param evaluate 评价等级，0表示全部，1表示好评，2表示中评，3表示带图评论
     * @return 包含商品评论分页信息的Page对象
     * @throws BusinessException 如果远程调用失败，抛出BusinessException异常
     */
// 实现根据产品ID、评价状态等信息查询商品评论的分页功能
    @Override
    public Page<ProdComm> queryWxProdCommPageByProd(Long current, Long size, Long prodId, Long evaluate) {
        // 创建评论分页对象
        Page<ProdComm> page = new Page<>(current, size);
        // 根据商品id分页查询单个商品的评论
        page = lambdaQuery()
                .eq(ProdComm::getProdId, prodId)
                .eq(ProdComm::getStatus, 1)
                .eq(0 == evaluate || 1 == evaluate || 2 == evaluate, ProdComm::getEvaluate, evaluate)
                .isNotNull(3 == evaluate, ProdComm::getPics)
                .orderByDesc(ProdComm::getCreateTime)
                .page(page);
        // 从分页对象中获取评论记录
        List<ProdComm> prodCommList = page.getRecords();
        // 判断是否有值
        if (ObjectUtil.isEmpty(prodCommList)) {
            return page;
        }
        // 从商品评论集合中获取会员openId集合
        List<String> openIdList = prodCommList.stream().map(ProdComm::getOpenId).collect(Collectors.toList());
        // 远程调用：根据会员openId集合查询会员对象集合
        Result<List<Member>> result = prodMemberFeign.getMemberListByOpenIds(openIdList);
        // 判断操作结果
        if (BusinessEnum.OPERATION_FAIL.getCode().equals(result.getCode())) {
            throw new BusinessException("根据会员openId集合查询会员对象集合，调用失败");
        }
        // 获取数据
        List<Member> memberList = result.getData();
        // 循环遍历评论集合
        prodCommList.forEach(prodComm -> {
            // 从会员对象集合中过滤出与当前会员对象的openId一致的会员对象
            Member member = memberList.stream()
                    .filter(m -> m.getOpenId().equals(prodComm.getOpenId()))
                    .collect(Collectors.toList()).get(0);
            // 将会员昵称进行脱敏操作
            StringBuilder stringBuilder = new StringBuilder(member.getNickName());
            StringBuilder replaceNickName = stringBuilder.replace(1, stringBuilder.length() - 1, "***");
            prodComm.setNickName(replaceNickName.toString());
            prodComm.setPic(member.getPic());
        });
        return page;
    }


}
